package IO;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class ReadFile {
    //使用字节流来读取文件
    public static void main(String[] args) throws IOException {
        //创建inputStream对象的时候,使用绝对路径或者相对路径都是可以的,也可以使用file对象
        InputStream inputStream = new FileInputStream("d:/test.txt");
        //进行读操作
//        while (true) {
//            //read读取的是一个字节, 但是它的返回值是一个int (原因 : 除了要表示byte里的 [0,255](-128~127) 但还需表示一个特殊情况 -1
//            // 这个情况表示读取文件结束了(读到文件末尾了))

              //一个读一个字符,返回值是ascii值
//            int b = inputStream.read();
//            if(b == -1) {
//                //说明读完了
//                break;
//            }
//            //读取到的每一个字节都是hello每个单词的ascii码值
//            //如果文件内容是汉字,那么打印的内容使用十六进制打印,结果就是每一个汉字的16进制编码
//            System.out.println(b);
//        }

        /* read 的第二个版本 ,需要调用者提前准备后一个数组
        *  这里的传参操作相当于把刚才准备好的数组,交给read方法,让read方法内部针对这个数组进行填写
        *  此处传入的buffer相当于 "输出型参数"
        * */
        /* len的结果是实际上是字符个数
         * 上面给的数组是1024 ,read就会尽可能的读取1024个字节读到数组里,但是文件的长度是有大有小的
         * 如果长度超过1024,那么每次只会读取1024个字符,,并且返回值是1024 剩下的字符只能通过循环继续读取出来
         * 如果长度小于1024,那么每次会读出长度个字符,read方法返回实际的读取长度
         * buffer 叫做缓冲区,存在的意义就是为了提高io的效率
         */
        while (true) {
            byte[] buffer = new byte[1024];
            //直接将5个字符全部读完
            int len = inputStream.read(buffer);
            System.out.println(len);
            if(len == -1) break;
            for (int i = 0; i < len; i++) {
                System.out.print(buffer[i] + " ");
            }
        }
        inputStream.close();
    }
}